package designparttern.singleton;

/**
 * 由于懒汉式在每次获取INSTANCE的时候都需要竞争锁
 * 而这个锁只是用于防止在第一次初始化的时候线程不安全
 * 却要影响整个单例对象的使用
 * <p>
 * 为了避免上述的性能损失,我们只在创建对象的时候才进行加锁操作
 */
class DoubleCheck {
    private static DoubleCheck INSTANCE;
    private static final Object LOCK = new Object();

    private DoubleCheck() {
    }

    private static DoubleCheck getInstance() {
        if (INSTANCE == null) {
            //  只有当需要创建对象的时候才加锁
            synchronized (LOCK) {
                if (INSTANCE == null) {
                    INSTANCE = new DoubleCheck();
                }
            }
        }
        return INSTANCE;
    }
}

